"""
1. xlrd和xlwt
    xlrd和xlwt是早期支持操作excel的库，目前最新版本都只支持xls格式，不支持xlsx格式文件。
    xlrd负责读取excel文件，xlwt负责对excel进行写的操作。
    xlwt 和 xlrd 不光名字像，连很多函数和操作格式也是完全相同。
    xlrd和xlwt不支持xlxs的原因：XLSX 是 Microsoft Office 2007 之后的 Excel 文件格式，它采用了基于 XML 的文件结构。与之前的 XLS 格式相比，XLSX 格式有更好的扩展性和兼容性。然而，xlrd 库是基于旧的二进制 XLS 文件格式开发的，因此无法直接读取 XLSX 文件


2. xlutils（excel utilities）
    是一个提供了许多操作修改 excel 文件方法的库。
    xlutils 库也仅仅是通过复制一个副本进行操作后保存一个新文件，
    xlutils 库就像是 xlrd 库和 xlwt 库之间的一座桥梁，因此，xlutils 库是依赖于 xlrd 和 xlwt 两个库的。
    简单来说，xlrd 负责读、xlwt 负责写、xlutils 负责提供辅助和衔接


3. xlwings 能够非常方便的读写 Excel 文件中的数据，并且能够进行单元格格式的修改

4. openpyxl
    通过 工作簿 “workbook - 工作表 sheet - 单元格 cell” 的模式对 .xlsx 文件进行读、写、改，并且可以调整样式。
    它是由于缺乏从 Python 中读取 / 编写 Office Open XML 格式的现有库而诞生的。
    支持读写xlsx文件，功能较广泛，可以设置单元格格式等；但是不支持读写xls文件。

5. pandas
    是基于 NumPy 的一种工具，该工具是为了解决数据分析任务而创建的。
    Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具

6. xlsxwriter
    是用于创建 Excel XLSX 文件的 Python 模块，可用于将文本、数字、公式和超链接写入 Excel2007 + XLSX 文件中的多个工作表。
    它可以用于将文本、数字和公式写入多个工作表，并支持格式、图像、图表、页面设置、自动筛选、条件格式和许多其他功能
    用于创建xlsx/xls文件；支持图片/表格/图表/格式等；缺点是不能打开/修改已有的文件

7. pandas适合数据分析和处理，openpyxl适合Excel文件的高级操作和格式化，而xlrd则用于读取旧版Excel文件

"""


import pandas as pd

from openpyxl import Workbook
from openpyxl.reader.excel import load_workbook
from openpyxl.styles import NamedStyle, Font, Border, PatternFill, Side, Alignment


def pandas():
    print("pandas--------------------------------")
    # 读取.xlsx文件
    # df = pd.read_excel('../File/pandas.xlsx', engine='openpyxl')

    # 读取.xls文件
    # df = pd.read_excel('../File/pandas.xlsx', engine='xlrd')

    df = pd.read_excel('../File/pandas.xlsx', sheet_name='Sheet1')
    print(f"pandas----\n{df}")

    # 求和
    total = df['名字'].sum()
    print(f"pandas--sum--A--\n{total}")

    # 计算Sales列的总和
    total_sales = df['wc'].sum()
    print(f'pandas--sum--B--:\n {total_sales}')

    # 均值
    mean = df['名字'].mean()
    print(f"pandas--mean--A--\n{mean}")

    #最大值 最小值
    max_value = df['名字'].max()
    min_value = df['名字'].min()
    print(f"pandas--min--A--\n{min_value}")
    print(f"pandas--max--A--\n{max_value}")

    # 写入 excel
    df.to_excel('../File/pandasOut1.xlsx', index=False)

def pandasWrite():
    print("pandasWrite--------------------------------")
    # 通过字典形式构建DataFrame
    df = pd.DataFrame({
        '工号': [1001, 1002, 1003],
        '姓名': ['张三', '李四', '王五'],
        '年龄': [28, 25, 30]
    })
    df = df.set_index('工号')  # 自定义索引
    df.to_excel('../File/pandas2.xlsx')  # 写入excel

    df = pd.read_excel('../File/pandas2.xlsx')  # 读取excel
    print(f"读取整个表---\n{df}")

    # 选择Name列数据
    names = df['姓名']
    print(f"特定列输出--\n{names}")

    # 选择第一行数据
    first_row = df.loc[0]
    print(f"特定行输出--\n{first_row}")

    # 过滤年龄大于25的行
    filtered_data = df[df['年龄'] > 25]
    print(filtered_data)

    # 添加新列
    df['籍贯'] = ['广东', '广西', '湖南']
    print(df)

    # 删除年龄列
    df = df.drop('年龄', axis=1)
    print(df)

    # 修改第一行第一个元素为'陈六'
    df.loc[0, '姓名'] = '陈六'
    print(df)

    # 读取另一个Excel文件
    df2 = pd.read_excel('../File/pandas.xlsx')
    # 合并两个DataFrame
    merged_df = pd.concat([df, df2])
    print(merged_df)

def openpyxl():
    print("openpyxl--------------------------------")
    # 创建一个新的工作簿
    wb = Workbook()
    ws = wb.active # 选择当前活动的工作表
    ws.title = "Sheet1" # 为工作表命名

    # 向工作表中添加数据
    data = [
        ['姓名', '年龄', '职业'],
        ['Alice', 30, 'Engineer'],
        ['Bob', 25, 'Designer']
    ]

    for row in data:
        ws.append(row)

    ws2 = wb.create_sheet(title="Sheet2") # 创建一个新的工作表
    wb.remove(ws2) # 删除工作表
    wb.save('../File/openpyxl.xlsx')    # 保存新建的 excel

    # 加载工作簿
    wb = load_workbook('../File/openpyxl.xlsx')
    ws = wb['Sheet1'] # 选择工作表

    # 定义样式
    currency_style = NamedStyle(name='currency', number_format='$#,##0.00')
    bold_font = Font(bold=True)
    thin_border = Border(left=Side(border_style="thin"),
                         right=Side(border_style="thin"),
                         top=Side(border_style="thin"),
                         bottom=Side(border_style="thin"))
    fill_color = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")

    # 应用样式
    ws['A1'].style = currency_style
    ws['A1'].font = bold_font
    ws['A1'].border = thin_border
    ws['A1'].fill = fill_color

    # 插入公式
    ws['C1'] = '=SUM(A:A)'  # 在C1单元格插入A列总和公式

    # 保存 excel
    wb.save('../File/openpyxl1.xlsx')

    # 从工作簿中读取单元格值
    wb = load_workbook("../File/openpyxl.xlsx")
    ws = wb.active
    print(ws["A1"].value)

    # 在工作表中合并单元格
    ws.merge_cells("A1:B1")
    wb.save("../File/openpyxl2.xlsx")

    # 在单元格中对齐文本
    wb = load_workbook("../File/openpyxl.xlsx")
    ws = wb.active
    cell = ws.cell(row=1, column=1)
    cell.value = "Hello World"
    cell.alignment = Alignment(horizontal='center', vertical='center')  # 单元格合并后居中对象
    wb.save("../File/openpyxl3.xlsx")

    # 添加 Row 和 Column
    wb = load_workbook("../File/openpyxl.xlsx")
    ws = wb.active
    ws.insert_rows(2)
    ws.insert_cols(1)
    wb.save("../File/openpyxl4.xlsx")

    # 删除行和列
    wb = load_workbook("../File/openpyxl.xlsx")
    ws = wb.active
    ws.delete_rows(2)
    ws.delete_cols(1)
    wb.save("../File/openpyxl5.xlsx")

    # 设置字体样式
    wb = load_workbook("../File/openpyxl.xlsx")
    ws = wb.active
    ws.cell(row=1, column=1).value = "hello"
    ws.cell(row=1, column=1).font = Font(size=24)
    ws.cell(row=2, column=2).value = "hello coders"
    ws.cell(row=2, column=2).font = Font(size=24, italic=True)
    ws.cell(row=3, column=3).value = "world"
    ws.cell(row=3, column=3).font = Font(size=24, bold = True)
    ws.cell(row=4, column=4).value = "He1lo World"
    ws.cell(row=4, column=4).font = Font(size=24, name="Times New Roman")
    wb.save("../File/openpyxl6.xlsx")

    # 执行公式
    wb = load_workbook("../File/openpyxl.xlsx")
    ws = wb.active
    ws["B10"] = "SUM(B1:B9)"
    ws["B11"] = "AVERAGE(B1:B9)"
    ws["B12"] = "PRODUCT(B1:B9)"
    ws["B13"] = "COUNT(B1:B9)"
    wb.save("../File/openpyxl7.xlsx")

pandas()
pandasWrite()
openpyxl()





















